package org.zero.controller;

import java.math.BigDecimal;
import java.util.Date;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.zero.model.Account;
import org.zero.model.User;

/**
 * @author Zero
 */
@Controller
@RequestMapping("/model_attribute")
public class ModelAttributeController {

    /*
      ModelAttribute：
      作用：request域数据共享，存储数据
      属性：
        name：同value，要绑定到的模型属性的名称
        binding：是否进行数据绑定
     */

    /**
     * 注解到方法上，该方法会优先在每个方法前执行，因此对于一个controller映射多个URL的用法来说，要谨慎使用
     * 此时注解与model.addAttribute()方法类似
     * 如果未指定存放key，默认在 model 中的 key 为返回类型首字母小写，value 为返回的值
     *
     * @return
     */
    @ModelAttribute
    public User method0() {
        System.out.println("ModelAttribute 注解的方法优先执行");
        return User.builder()
                .id(6547)
                .name("小明")
                .account(Account.builder()
                        .id(100434)
                        .name("小小明")
                        .money(new BigDecimal("437486.54"))
                        .build())
                .birthday(new Date())
                .build();
    }

    /**
     * 注解到参数上，从model中取key为指定名称的数据并赋给参数，不指定key时默认为获取参数同名数据
     * 当不写该注解时，springmvc 框架也可以通过参数名和参数类型指定封装给参数
     *
     * @param user
     * @return
     */
    @RequestMapping("/m1")
    private String method1(@ModelAttribute User user) {
        System.out.println("方法1执行：" + user);

        return "success";
    }
}
